<?php

/**
 * @author nguyendu
 * @copyright 2012
 */
require_once("IDatabase.php");
require_once("lib/ManagerIniFile/IniFile.class.php");
class DataBase implements IDatabase
{
    const host="localhost";
    const username="root";
    const password="";
    const dbname="demo_mvc";
    private $connection;
    private $transaction;
    private $numrows=0;
    private $rowAffected=0;
    private $fields=null;
    public $error="";
    private $query="";
    public function __construct()
    {
        $this->connect();
    }

    /**
     * Hàm khởi không tham số tạo kết nối đến Mysql
     */
    public function connect()
    {
        $iniFile=new IniFile("config/config.ini");
        $database=$iniFile->get("Database");
        //$this->connection=@mysql_connect(self::host,self::username,self::password);
        $this->connection=@mysql_connect($database["host"],$database["username"],$database["password"]);
        if(!$this->connection)
        {
                //$this->error="Không thể kết nối đến mysql.Bạn chắc chắn đã cấu hình kết nối";
                die("Không thể kết nối đến mysql.Bạn chắc chắn đã cấu hình kết nối");
            }
            else
            {
                //$db=@mysql_select_db(self::dbname,$this->connection);
                $db=@mysql_select_db($database["dbname"],$this->connection);
                mysql_query("SET character_set_results=utf8",$this->connection);
	            mb_language('uni');
                mb_internal_encoding('UTF-8');
                if(!$db)
                {
                    //$this->error="Cơ sở dữ liệu '$this->database' không tồn tại.Xin vui lòng thử lại";
                    die("Cơ sở dữ liệu '$this->database' không tồn tại.Xin vui lòng thử lại");
                }
                else
                {
                    return $this->connection;
                }
            }
    }
    
    /**
     * Hàm lấy các cột của bảng trong bảng dữ liệu
     * @param $numfield(int)-số cột dữ liệu cần lấy tên
     * @param $resource(object)-đối tượng truy vấn
    */
    public function getField($numfield,$resource)
    {
        $arr=array();
        for($i=0;$i<$numfield;$i++)
        {
            array_push($arr,@mysql_field_name($resource,$i));
        }
    }
    /**
     * Hàm thực thi câu lệnh SQL
     * @param $query(string)- chuỗi truy vấn
     */
    public function executeQuery($query)
    {
        $this->query=$query;
        $result=@mysql_query($query,$this->connection);
        if(!$result)
        {
            if($this->transaction)
            {
               //@mysql_query("ROLLBACK",$this->connection);
               $this->rollBackTransaction();
            }
            $this->error="Có lỗi đã xảy ra khi thực hiện";
        }
        else
        {
            $this->rowAffected=@mysql_affected_rows();
            $this->numrows=@mysql_num_rows($result);
            $this->fields=$this->getField($this->numrows,$result);
            return $result;
        }
    }
    /**
     * Hàm lấy số row được truy vấn
     */
    public function getNumRows()
    {
        return $this->numrows;
    }
    
    /**
     * Hàm lấy số row affeted được truy vấn
     */
    public function getRowsAffected()
    {
        return $this->rowAffected;
    }
    
    /**
     * Hàm bắt đầu một giao dịch
     */
    public function starTransaction()
    {
         $this->executeQuery("BEGIN");
         $this->transaction=true;
    }
    /**
     * Hàm thực thi quay lại điểm phục hồi trước khi thực thi câu lệnh insert,delete,update
     *
     */
    public function rollBackTransaction()
    {
         $this->executeQuery("ROLLBACK");
         $this->transaction=true;
    }
    /**
     * Hàm ghi nhận thành công của giao dịch
     */
    public function commitTransaction()
    {
        $this->executeQuery("COMMIT");
        $this->transaction=true;
    }
    /**
     * Hàm ngắt kết nối
     */
    public function closeConnection()
    {
        @mysql_close($this->connection);
    }
    /**
     * Hàm lấy ID của bảng khi thực hiện thành công câu lệnh Insert
    */
    public function getLastId()
    {
        $id = mysql_insert_id($this->connection);
        return intval($id);
    }
    /**
     * Hàm trả về câu lệnh Insert
     * @param $tableName(string)- tên bảng cần insert
     * @param $paramInsert(array)-tên tham số và giá trị cần Insert
    */
    public function insertQuery($tableName,$paramInsert=array())
    {
        $sql="INSERT INTO `$tableName`( ";
        $i=0;
        foreach($paramInsert as $column=>$value)
        {
            if($i<count($paramInsert)-1)
                $sql.=" `".$column."`,";
            else 
                $sql.=" `".$column."` ";
            $i++;
        }
        $sql.=") VALUES( ";
        $i=0;
        foreach($paramInsert as $column=>$value)
        {
            if(is_int($value)||is_float($value)||is_double($value)||is_integer($value)||is_null($value))
            {
                if(is_null($value))
                    $value='NULL';
                if($i<count($paramInsert)-1)
                    $sql.="$value,";
                else 
                    $sql.="$value";
            }
            else
            {
                if($i<count($paramInsert)-1)
                    $sql.=" '$value',";
                else 
                    $sql.=" '$value' ";
            }
            $i++;
        }
        $sql.=" );";
        return $sql;

    }
    /**
     *Hàm trả về câu lệnh select không có điều kiện where
     */
    public function selectQueryWithoutWhere($tableName,$rowStar=0,$rowEnd=30,$OrderByColumn=null,$SortType=null)
    {
        $sql="SELECT * FROM  `".$tableName."`";
        if(empty($OrderByColumn)&&empty($SortType))
        {
            $sql.=" LIMIT {$rowStar},{$rowEnd}";
            return $sql;
        }
        else
        {
            $sql.=" ORDER BY $OrderByColumn $SortType ";
            $sql.=" LIMIT {$rowStar},{$rowEnd}";
        }
		return $sql;	
    }
    
    public function selectQueryWithoutJoin($tableName,$rowStar,$rowEnd,$columnSelect=array(),$paramWhere=array(),$OrderByColumn=null,$SortType=null)
    {
            $sql="SELECT ";
            
            for($i=0;$i<count($columnSelect);$i++)
            {
                if($i<count($columnSelect)-1)
                    $sql.="`".$columnSelect[$i]."`,";
				else
					$sql.="`".$columnSelect[$i]."`";
            }
            $sql.="\nFROM `".$tableName."`\n WHERE ";
            $j=0;
            foreach($paramWhere as $column=>$value)
            {
                if(is_int($value)||is_float($value)||is_double($value)||is_integer($value))
                {
                    if($j<count($paramWhere)-1)
                        $sql.=" `$column`=$value AND ";
                    else
                        $sql.=" `$column`=$value ";
                }
                else
                {
                    if($j<count($paramWhere)-1)
                        $sql.=" `$column`=N'$value' AND ";
                    else
                        $sql.=" `$column`=N'$value' ";
                }
                $j++;
            }
            if(empty($OrderByColumn)&&empty($SortType))
            {
                $sql.=" LIMIT {$rowStar},{$rowEnd}";
            }
            else
            {
                $sql.=" ORDER BY $OrderByColumn $SortType ";
                $sql.=" LIMIT {$rowStar},{$rowEnd}";
            }
			return $sql;
       }
       public function updateQuery($tableName,$paramSET=array(),$paramWhere=array())
       {
            $sql="UPDATE `".$tableName."` SET ";
            $j=0;
            foreach($paramSET as $column=>$value)
            {
                if(is_int($value)||is_float($value)||is_double($value)||is_integer($value))
                {
                    if($j<count($paramSET)-1)
                        $sql.=" `$column`=N'$value',";
                    else
                        $sql.=" `$column`=$value ";
                }
                else
                {
                    if($j<count($paramSET)-1)
                        $sql.=" `$column`=N'$value',";
                    else
                        $sql.=" `$column`=N'$value'";
                }
                $j++;
            }
            $sql.="WHERE";
            foreach($paramWhere as $column=>$value)
            {
                if(is_int($value)||is_float($value)||is_double($value)||is_integer($value))
                {
                    if($j<count($paramWhere)-1)
                        $sql.=" `$column`=$value AND ";
                    else
                        $sql.=" `$column`=$value ";
                }
                else
                {
                    if($j<count($paramWhere)-1)
                        $sql.=" `$column`=N'$value' AND ";
                    else
                        $sql.=" `$column`=N'$value' ";
                }
                $j++;
            }
			return $sql;
       }
       
       
       public function deleteQuery($tableName,$paramWhere=array(),$Operator=null)
       {
            $sql="DELETE FROM `".$tableName."` WHERE";
            $j=0;
            foreach($paramWhere as $column=>$value)
            {
                if(is_int($value)||is_float($value)||is_double($value)||is_integer($value))
                {
                    if(!empty($Operator))
                    {
                        if($j<count($paramWhere)-1)
                        {
                            $sql.=" `$column`$Operator$value AND ";
                        }
                        else
                        {
                            $sql.=" `$column`$Operator$value ";
                        }
                    }
                    else
                    {
                        if($j<count($paramWhere)-1)
                        {
                            $sql.=" `$column`=$value AND ";
                        }
                        else
                        {
                            $sql.=" `$column`=$value ";
                        }
                    }
                }
                else
                {
                    if($j<count($paramWhere)-1)
                        $sql.=" `$column`=N'$value' AND ";
                    else
                        $sql.=" `$column`=N'$value' ";
                }
                $j++;
            }
			return $sql;
       }
}
?>